/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.ecommerce.dao.impl;

import br.com.ecommerce.dao.ItemProdutoDAO;
import br.com.ecommerce.dao.pojo.EntityPojo;
import br.com.ecommerce.dao.pojo.ItemProduto;
import br.com.ecommerce.exceptions.DatabaseException;
import br.com.ecommerce.exceptions.IdInvalidoException;
import br.com.ecommerce.exceptions.ObjetoInvalidoException;
import br.com.ecommerce.factory.DatabaseFactory;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Classe que implementa os métodos que manipulam a entidade ItemProduto
 * @author Afonso
 */
public class ItemProdutoDAOImpl implements ItemProdutoDAO {

    @Override
    public void create(EntityPojo obj) throws ObjetoInvalidoException, 
                                                DatabaseException {
        if (obj == null || !(obj instanceof ItemProduto)) {

           throw new ObjetoInvalidoException("Objeto POJO é null ou não "
                   + "é do tipo ItemProduto");
        }

        ItemProduto itemProduto = (ItemProduto)obj;
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sqlInsert;
        String sqlNextId;
        String sqlInsertRelacao;
        Integer id;
        try {
            sqlNextId = "Select ITEM_PRODUTO_SEQ.nextval from dual";

            stmt = conn.createStatement();

            ResultSet rsNextId = stmt.executeQuery(sqlNextId);
            if (rsNextId.next()) {
                id = rsNextId.getInt(1);
                sqlInsert = "insert into ITEM_PRODUTO values ('"
                        + id + "', " +
                    "'" + itemProduto.getNomeItem() + "', " +
                    "'" + itemProduto.getDescricaoItem() + "', " +
                    "'" + itemProduto.getValorItem().toString().replace(".", ",") + "')";

                stmt.execute(sqlInsert);

                sqlInsertRelacao = "insert into RELACAO_PRODUTO_ITEM values ('"
                        + itemProduto.getIdProduto() + "', '" + id + "')";

                stmt.execute(sqlInsertRelacao);
                
            } else {
                throw new DatabaseException("Erro ao tentar recuperar o próximo"
                        + "ID da tabela ITEM_PRODUTO");

            }
            stmt.close();
            conn.close();
        } catch (SQLException ex) {
            Logger.getLogger(ItemProdutoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        } 
    }

    @Override
    public EntityPojo readById(Integer idPrimaryKey) throws IdInvalidoException,
                                                            DatabaseException {
        if (idPrimaryKey == null) {
           throw new IdInvalidoException("ID inválido");

        }

        ItemProduto itemProduto = new ItemProduto();
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;
        try {
            sql = "SELECT * FROM ITEM_PRODUTO WHERE ID_ITEM="+idPrimaryKey;

            Logger.getLogger(ItemProdutoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            if (rs.next()) {
                itemProduto.setIdPrimaryKey(idPrimaryKey);
                itemProduto.setNomeItem(rs.getObject(2).toString());
                itemProduto.setDescricaoItem(rs.getObject(3).toString());
                itemProduto.setValorItem(new Float(rs.getObject(4).toString()));

            } else {
                 throw new DatabaseException("Não há dados na base de dados para"
                         + " a query: " + sql);

            }
            stmt.close();
            conn.close();
        } catch (SQLException ex) {
            Logger.getLogger(ItemProdutoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }

        return itemProduto;
    }

    @Override
    public List readAll() throws DatabaseException {
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;
        List<ItemProduto> list = new ArrayList<ItemProduto>();
        try {
            sql = "SELECT * FROM ITEM_PRODUTO ORDER BY ID_ITEM";

            Logger.getLogger(ItemProdutoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            while (rs.next()) {
                ItemProduto itemProduto = new ItemProduto();
                itemProduto.setIdPrimaryKey(new Integer(rs.getObject(1).toString()));
                itemProduto.setNomeItem(rs.getObject(2).toString());
                itemProduto.setDescricaoItem(rs.getObject(3).toString());
                itemProduto.setValorItem(new Float(rs.getObject(4).toString()));

//                Logger.getLogger(ClienteDAOImpl.class.getName())
//                            .log(Level.INFO, "String SQL : " + cliente.toString());

                list.add(itemProduto);
            }


            stmt.close();
            conn.close();

        } catch (SQLException ex) {
            Logger.getLogger(ItemProdutoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }

        return list;

    }

    @Override
    public void deleteById(Integer idPrimaryKey) throws IdInvalidoException,
                                                        DatabaseException {
        if (idPrimaryKey == null) {
           throw new IdInvalidoException("ID inválido");

        }

        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;
        String sqlRelacaoItem;

        sqlRelacaoItem = "DELETE FROM RELACAO_PRODUTO_ITEM WHERE ID_ITEM='" + idPrimaryKey+"'";
        try {
            stmt = conn.createStatement();
            stmt.execute(sqlRelacaoItem);

        } catch (SQLException ex) {
            Logger.getLogger(ItemProdutoDAOImpl.class.getName()).
                        log(Level.SEVERE, ex.getMessage(), ex);
            throw new DatabaseException("Problemas ao excluir o item da "
                    + "relacao_produto_item" + ex.getMessage(), ex.getCause());
        }


        try {
            sql = "DELETE FROM ITEM_PRODUTO WHERE ID_ITEM='" + idPrimaryKey+"'";

            Logger.getLogger(ItemProdutoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            
            stmt.execute(sql);

            stmt.close();
            conn.close();

        } catch (SQLException ex) {
            Logger.getLogger(ItemProdutoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }
    }

    @Override
    public void update(EntityPojo obj) throws ObjetoInvalidoException,
                                                DatabaseException {
        if (obj == null || !(obj instanceof ItemProduto)) {
           throw new ObjetoInvalidoException("Objeto POJO é null ou não "
                   + "é do tipo ItemProduto");
        }

        ItemProduto itemProduto = (ItemProduto)obj;
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;

        try {
            sql = "UPDATE ITEM_PRODUTO SET NOME_ITEM='" +
                    itemProduto.getNomeItem() + "', "
                    + "DESCRICAO_ITEM='" + itemProduto.getDescricaoItem() + "', "
                    + "VALOR='" + itemProduto.getValorItem().toString().replace(".", ",") + "' "
                    + "WHERE ID_ITEM = " + itemProduto.getIdPrimaryKey();

            Logger.getLogger(ItemProdutoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            stmt.execute(sql);

            stmt.close();
            conn.close();
        } catch (SQLException ex) {
            Logger.getLogger(ItemProdutoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }

    }

}
